package com.lagou.server;

import com.lagou.model.Question;
import com.lagou.model.User;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 编程实现数据的存取
 */

public class ServerDao {

    /**
     * 编程实现管理员账号和密码的校验并将结果返回
     * @param user
     */
    public boolean serverManagerCheck(User user){
        if("admin".equals(user.getUserName()) && "123456".equals(user.getPassword())){
            return true;
        }
        return false;
    }


    /**
     * 编程实现学员账号和密码的校验并将结果返回
     * @param user
     */
    public boolean serverUserCheck(User user){
        List<User> users = loadStudentData();
        for (int i = 0; i < users.size(); ++i) {//从下标0，即第一个元素开始到最后一个元素，遍历整个集合
            //调用get方法得到User类型的成员变量用户名和密码并比较
            if ((users.get(i).getUserName().equals(user.getUserName())) && (users.get(i).getPassword().equals(user.getPassword()))) {
                //如果有相同信息，则返回true并退出比较循环
                return true;
            }
        }
        return false;
    }


    /**
     * 编程实现导入学生账户信息并返回
     * @return
     */
    public List<User> loadStudentData(){
        //list集合用于记录学生账户信息
        List<User> list = new ArrayList<>();

        // 时打开输入流，读取学生信息
        ObjectInputStream ois = null;
        FileInputStream fis = null;
        try {
            //以学生信息.txt文件构造FileInputStream的对象fis
            fis = new FileInputStream("g:/学生账户信息.txt");
            //通过fis构造ObjectInputStream的对象ois
            ois = new ObjectInputStream(fis);
            //调用readObject方法从输入流中读取对象，返回值作为ArrayList集合的元素添加到list1集合中
            ArrayList list1 = (ArrayList) ois.readObject();
            //将list1中的所有对象添加到list集合，即学生信息中
            list.addAll(list1);
            System.out.println("导入学生账户信息成功");
        } catch (IOException | ClassNotFoundException e) {
            //捕获异常
            //e.printStackTrace();
            System.out.println("未发现学生账户信息");
        } finally {
            //关闭两个输入流
            try {
                if(null != ois){
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(null != fis){
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return list;
        }

    }


    /**
     * 编程实现将学生信息导入到文件中的功能
     * @param list
     */
    public void saveStudentDate(List<User> list){
        //将学生信息保存到文件中
        //创建对象oos用于调用ObjectOutputStream的方法
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("g:/学生账户信息.txt"));
            //调用writeObject方法将list集合中的对象，即学生信息写入到输出流中，即将信息输出到指定文件中
            oos.writeObject(list);
            System.out.println("\n学生账户信息保存成功");
            //捕获异常
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭输出流
            try {
                if(null != oos){
                    oos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 编程实现初始考题库
     * @return
     */
    public ArrayList<Question> questionBank(){
        //声明一个集合用于记录Question类的考题数据
        ArrayList<Question> quzBank = new ArrayList<>();

        //写入考题
        quzBank.add(new Question("在Java中有一个类Aoo,下面为其构造方法的声明,正确的是", new String[]{"A. void Aoo(){ }", "B. Aoo(){ }", "C. aoo(){ }", "D. void aoo(){ }"}, "B"));
        quzBank.add(new Question("在Java中,可以创建长度为4的数组对象的是", new String[]{"A. int[] arr = new int[];", "B. int[] arr = new int(4);", "C. int[] arr = new int[] { 12,34,56,78 };", "D. int[] arr = new int[4] { 12,34,56,78 };"}, "D"));
        quzBank.add(new Question("在Java中,以下哪个是public void Test()的重载方法", new String[]{"A. void Test() { }", "B. public int Test() { }", "C. public void Test() { }", "D. public void Test(int num) { }"}, "D"));
        quzBank.add(new Question("关键字abstract可以和下列哪个关键字一起使用", new String[]{"A. final", "B. private", "C. public", "D. static"}, "C"));
        quzBank.add(new Question("下列运算结果正确的是", new String[]{"A. int x = 4590; x = x / 1000 *1000; x的结果是4590", "B. int x = 3; x = x++; x的结果是4", "C. short x = 3; x = x+4; x的结果是7", "D. int x = 2; boolean b = x>3 && x<6; b的结果是false"}, "D"));
        quzBank.add(new Question("下列哪一个是String类下的方法",new String[]{"A. add","B. put","C. compareTo","D. string"},"C"));
        quzBank.add(new Question("下列哪一个是java.util包下的类",new String[]{"A. Math","B. Object","C. Enum","D. Scanner"},"D"));
        quzBank.add(new Question("下列哪一个不是Java当中的包装类",new String[]{"A. Integer","B. Char","C. Long","D. Short"},"B"));
        quzBank.add(new Question("JDK是", new String[]{"A. 一种全新的程序语言", "B. 一种程序开发辅助工具", "C. 一种由Java写成的，并支持Java Applet的浏览器", "D. 一种游戏软件"}, "C"));
        quzBank.add(new Question("要想定义一个不能被实例化的抽象类,在类定义中必须加上修饰符", new String[]{"A. final", "B. public", "C. private", "D. abstract"}, "D"));

        //将考题集合作为返回值返回出去
        return quzBank;
    }


    /**
     * 编程实现筛选需要用于考试的考题
     * @return
     */
    public ArrayList<Question> finalexam(){
        //调用题库方法得到所有题目
        ArrayList<Question> list = loadQuestionData();
        //打乱题库顺序
        Collections.shuffle(list);
        //准备一个集合用于记录考试所需的考题
        ArrayList<Question> exam = new ArrayList<>();
        //选择5题作为考试考题
        for(int i = 0; i < 5; ++i){
            exam.add(list.get(i));
        }

        return exam;
    }


    /**
     * 编程实现导入学考题信息并返回
     * @return
     */
    public ArrayList<Question> loadQuestionData(){
        //list集合用于记录考题信息
        ArrayList<Question> list = new ArrayList<>();

        // 时打开输入流，读取考题信息
        ObjectInputStream ois = null;
        FileInputStream fis = null;
        try {
            //以考题信息.txt文件构造FileInputStream的对象fis
            fis = new FileInputStream("g:/考题信息.txt");
            //通过fis构造ObjectInputStream的对象ois
            ois = new ObjectInputStream(fis);
            //调用readObject方法从输入流中读取对象，返回值作为ArrayList集合的元素添加到list1集合中
            ArrayList list1 = (ArrayList) ois.readObject();
            //将list1中的所有对象添加到list集合，即考题信息中
            list.addAll(list1);
            System.out.println("导入考题信息成功");
        } catch (IOException | ClassNotFoundException e) {
            //捕获异常
            //e.printStackTrace();
            //System.out.println("未发现考题信息");
            //未有考题时导入初始题库
            ArrayList<Question> questions = questionBank();
            //将初始题库添加到list中
            list.addAll(questions);
        } finally {
            //关闭两个输入流
            try {
                if(null != ois){
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(null != fis){
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            //返回考题信息
            return list;
        }

    }


    /**
     * 编程实现将考题信息导入到文件中的功能
     * @param list
     */
    public void saveQuestionData(List<Question> list){
        //将学生信息保存到文件中
        //创建对象oos用于调用ObjectOutputStream的方法
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("g:/考题信息.txt"));
            //调用writeObject方法将list集合中的对象，即学生信息写入到输出流中，即将信息输出到指定文件中
            oos.writeObject(list);
            System.out.println("\n考题保存成功");
            //捕获异常
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭输出流
            try {
                if(null != oos){
                    oos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}



